Import librairies
import yfinance as yf
import pandas as pd
import csv
from tqdm.notebook import tqdm
import html5lib
import plotly.express as px
from datetime import datetime
import plotly.graph_objects as go
import plotly.figure_factory as ff
from plotly.subplots import make_subplots
import numpy as np
import plotly.offline as pyo
from scipy.stats import linregress, norm
pyo.init_notebook_mode()
pd.set_option("display.max_columns", 101)
stocks = {
'Materials': {'Name': 'Newmont Corporation', 'Ticker': 'NEM'},
'Communication Services': {'Name': 'Alphabet Inc.', 'Ticker': 'GOOGL'},
'Consumer Discretionary': {'Name': 'Amazon.com Inc.', 'Ticker': 'AMZN'},
'Consumer Staples': {'Name': 'PepsiCo Inc.', 'Ticker': 'PEP'},
'Energy': {'Name': 'National Oilwell Varco Inc.', 'Ticker': 'NOV'},
'Financial Services': {'Name': 'Bank of America Corp', 'Ticker': 'BAC'},
'Healthcare': {'Name': 'HCA Healthcare', 'Ticker': 'HCA'},
'Industrials': {'Name': 'Boeing Company', 'Ticker': 'BA'},
'Real Estate': {'Name': 'Host Hotels & Resorts', 'Ticker': 'HST'},
'Information Technology': {'Name': 'Apple Inc.', 'Ticker': 'AAPL'},
'Utilities': {'Name': 'American Electric Power', 'Ticker': 'AEP'}
}
data = yf.download(
tickers = [stocks[stock]['Ticker'] for stock in stocks],
group_by = 'ticker',
start="2018-06-30"
)
market = yf.download(
tickers = "^GSPC",
start="2018-06-30"
)
market.dropna(inplace=True)
market['Returns'] = market.Open.pct_change()
market['Logs'] = np.log(market.Open) - np.log(market.Open.shift(1))
market.dropna(inplace=True)
stocks_name = []
for ticks in data.columns.levels[0]:
for stock in stocks:
if ticks == stocks[stock]['Ticker']:
stocks_name.append(stocks[stock]['Name'])
data.columns.set_levels(stocks_name, level=0, inplace=True)
data['Apple Inc.']
data.dropna(inplace=True)
for name in stocks_name:
data[name, 'Returns'] = data[name].Open.pct_change()
for name in stocks_name:
data[name, 'Logs'] = np.log(data[name].Open) - np.log(data[name].Open.shift(1))
data.sort_index(axis=1, inplace=True)
data.dropna(inplace=True)
data.describe(include='all')
stats = pd.DataFrame(
{
'Std': [data[name].Returns.std() for name in stocks_name],
'Annual Std': [data[name].Returns.std()* np.sqrt(252) for name in stocks_name],
'Mean': [data[name].Returns.mean() for name in stocks_name],
'Median': [np.median(data[name].Returns) for name in stocks_name],
'Min': [data[name].Returns.min() for name in stocks_name],
'Max': [data[name].Returns.max() for name in stocks_name],
'Kurtosis': [data[name].Returns.kurtosis() for name in stocks_name],
'Skewness': [data[name].Returns.skew() for name in stocks_name],
'Alpha': [linregress(data[name].Returns, market.Returns).intercept for name in stocks_name],
'Beta': [linregress(data[name].Returns, market.Returns).slope for name in stocks_name],
'VaR 95% HS': [data[name].Returns.sort_values(ascending=True).quantile(0.05) for name in stocks_name],
'VaR 95% DN': [norm.ppf(1-0.95, data[name].Returns.mean(), data[name].Returns.std()) for name in stocks_name],
'Systemic Risk': [linregress(data[name].Returns, market.Returns).slope**2 * market.Returns.var() for name in stocks_name],
},
index=[name for name in stocks_name]
).round(6)
market_stats = pd.DataFrame(
{
'Std': [market.Returns.std()],
'Annual Std': [market.Returns.std()* np.sqrt(252)],
'Mean': [market.Returns.mean()],
'Median': [np.median(market.Returns.std())],
'Min': [market.Returns.min()],
'Max': [market.Returns.max()],
'Kurtosis': [market.Returns.kurtosis()],
'Skewness': [market.Returns.skew()],
'Alpha': [linregress(market.Returns, market.Returns).intercept],
'Beta': [linregress(market.Returns, market.Returns).slope],
'VaR 95% HS': [market.Returns.sort_values(ascending=True).quantile(0.05)],
'VaR 95% DN': [norm.ppf(1-0.95, market.Returns.mean(), market.Returns.std())],
'Systemic Risk': [linregress(market.Returns, market.Returns).slope**2 * market.Returns.var()]
},
index=['S&P500']
).round(6)
market_stats
stats
market_stats_logs = pd.DataFrame(
{
'Std': [market.Logs.std()],
'Annual Std': [market.Logs.std()* np.sqrt(252)],
'Mean': [market.Logs.mean()],
'Median': [np.median(market.Logs.std())],
'Min': [market.Logs.min()],
'Max': [market.Logs.max()],
'Kurtosis': [market.Logs.kurtosis()],
'Skewness': [market.Logs.skew()],
'Alpha': [linregress(market.Logs, market.Logs).intercept],
'Beta': [linregress(market.Logs, market.Logs).slope],
'VaR 95% HS': [market.Logs.sort_values(ascending=True).quantile(0.05)],
'VaR 95% DN': [norm.ppf(1-0.95, market.Logs.mean(), market.Logs.std())],
'Systemic Risk': [linregress(market.Logs, market.Logs).slope**2 * market.Logs.var()]
},
index=['S&P500']
).round(6)
stats_logs = pd.DataFrame(
{
'Std': [data[name].Logs.std() for name in stocks_name],
'Annual Std': [data[name].Logs.std()* np.sqrt(252) for name in stocks_name],
'Mean': [data[name].Logs.mean() for name in stocks_name],
'Median': [np.median(data[name].Logs) for name in stocks_name],
'Min': [data[name].Logs.min() for name in stocks_name],
'Max': [data[name].Logs.max() for name in stocks_name],
'Kurtosis': [data[name].Logs.kurtosis() for name in stocks_name],
'Skewness': [data[name].Logs.skew() for name in stocks_name],
'Alpha': [linregress(data[name].Logs, market.Logs).intercept for name in stocks_name],
'Beta': [linregress(data[name].Logs, market.Logs).slope for name in stocks_name],
'VaR 95% HS': [data[name].Logs.sort_values(ascending=True).quantile(0.05) for name in stocks_name],
'VaR 95% DN': [norm.ppf(1-0.95, data[name].Logs.mean(), data[name].Logs.std()) for name in stocks_name],
'Systemic Risk': [linregress(data[name].Logs, market.Logs).slope**2 * market.Logs.var() for name in stocks_name],
},
index=[name for name in stocks_name]
).round(6)
market_stats_logs
stats_logs
Apple Analysis
fig = px.line(x=data['Apple Inc.'].index, y=data['Apple Inc.'].Close)
fig.update_xaxes(rangeslider_visible=True)
fig.update_layout(
width=1200,
height=600,
title='Apple Analysis during the COVID',
yaxis_title='Closing Price',
xaxis_title='Date',
shapes = [dict(
x0='2020-02-15', x1='2020-02-15', y0=0, y1=1, xref='x', yref='paper',
line_width=2)],
annotations=[dict(
x='2020-02-17', y=0.95, xref='x', yref='paper',
showarrow=False, xanchor='left', text='COVID Begins')],
yaxis=dict(
ticksuffix=' $'
),
)
pyo.iplot(fig, filename='jupyter-basic_bar')
Amazon Analysis
fig = go.Figure(data=[go.Candlestick(x=data['Amazon.com Inc.'].index,
open=data['Amazon.com Inc.'].Open,
high=data['Amazon.com Inc.'].High,
low=data['Amazon.com Inc.'].Low,
close=data['Amazon.com Inc.'].Close)])
fig.update_layout(
width=1200,
height=800,
title='Amazon.com Analysis during the COVID',
yaxis_title='Prices',
shapes = [dict(
x0='2020-02-15', x1='2020-02-15', y0=0, y1=1, xref='x', yref='paper',
line_width=2)],
annotations=[dict(
x='2020-02-17', y=0.95, xref='x', yref='paper',
showarrow=False, xanchor='left', text='COVID Begins')],
yaxis=dict(
ticksuffix=' $'
),
)
pyo.iplot(fig, filename='test')
Boeing Company Analysis
colors = np.where(data['Boeing Company'].Returns < 0, 'red', 'green')
# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])
# Add traces
fig.add_trace(
go.Scatter(x=data['Boeing Company'].index, y=data['Boeing Company'].Close, name="Closing Prices", yaxis="y"),
secondary_y=False
)
fig.add_trace(
go.Bar(x=data['Boeing Company'].index, y=(data['Boeing Company'].Returns * 100), name="Returns", marker_color=colors, yaxis="y1"),
secondary_y=True
)
# Set x-axis title
fig.update_xaxes(title_text="Date")
# Set y-axes titles
# fig.update_yaxes(title_text="<b>primary</b> yaxis title", secondary_y=False)
# fig.update_yaxes(title_text="<b>secondary</b> yaxis title", secondary_y=True)
fig.update_layout(
width=1200,
height=600,
title='Boeing Company Analysis during the COVID',
yaxis=dict(
title="TSLA Close's Prices",
ticksuffix=' $'
),
yaxis2=dict(
title="TSLA Returns",
ticksuffix = '%'
),
shapes = [dict(
x0='2020-02-15', x1='2020-02-15', y0=0, y1=1, xref='x', yref='paper',
line_width=2)],
annotations=[dict(
x='2020-02-17', y=0.95, xref='x', yref='paper',
showarrow=False, xanchor='left', text='COVID Begins')]
)
pyo.iplot(fig)
Compare Stocks
fig = go.Figure()
visible = [False] * len(stocks_name)
visible[0] = True
for i, name in enumerate(stocks_name):
fig.add_trace(
go.Scatter(
x = data[name].index,
y = data[name].Close,
name = name,
visible=visible[i]
)
)
buttons = []
for i, name in enumerate(stocks_name):
false_true = [False] * len(stocks_name)
false_true[i] = True
buttons.append(
dict(label = name,
method = 'update',
args = [{'visible': false_true}])
)
fig.update_layout(
updatemenus=[
dict(buttons=buttons,
direction="down",
pad={"r": 10, "t": 10},
x=0.8,
xanchor="left",
y=1.2,
yanchor="top",
active=0,
)],
)
fig.update_layout(
width=1200,
height=600,
title='Two years in S&P500',
yaxis_title='Closing Prices',
shapes = [dict(
x0='2020-02-15', x1='2020-02-15', y0=0, y1=1, xref='x', yref='paper',
line_width=2)],
annotations=[
dict(x='2020-02-17', y=0.95, xref='x', yref='paper',
showarrow=False, xanchor='left', text='COVID Begins'),
dict(text="Choose Stocks:", showarrow=False,x=0.66,
xanchor='left', y=1.17, yanchor="top",
yref='paper', xref='paper',
font=dict(
# family="Courier New, monospace",
size=18,
color="Black")
)],
yaxis=dict(
ticksuffix=' $'
),
)
pyo.iplot(fig)